import numpy as np


# 参考网站
# https://blog.csdn.net/SeizeeveryDay/article/details/125025784

# 一、基于分布的方法
# 1. 3sigma
# 基于正态分布，3sigma准则认为超过3sigma的数据为异常点。

def three_sigma(s):
    mu, std = np.mean(s), np.std(s)
    lower, upper = mu - 3 * std, mu + 3 * std
    return lower, upper


# 2.Z-score
# Z-score为标准分数，测量数据点和平均值的距离，若A与平均值相差2个标准差，Z-score为2。当把Z-score=3作为阈值去剔除异常点时，便相当于3sigma。

def z_score(s):
    z_score = (s - np.mean(s)) / np.std(s)
    return z_score


# 3.boxplot
# 箱线图时基于四分位距（IQR）找异常点的。
def boxplot(s):
    q1, q3 = s.quantile(.25), s.quantile(.75)
    iqr = q3 - q1
    lower, upper = q1 - 1.5 * iqr, q3 + 1.5 * iqr
    return lower, upper
